const electron = require('electron');
const {
  app,
  dialog,
  Menu,
  BrowserWindow,
  ipcMain,
  globalShortcut
} = electron;
const path = require('path');
const url = require('url');
const pjson = require('../package.json');
const windowStateKeeper = require('electron-window-state');

/**
 * 管理未处理的异常
 */
process.on('uncaughtException', (e) => {
  console.error(`Caught unhandled exception: ${e}`);
  dialog.showErrorBox('Caught unhandled exception', e.message || 'Unknown error message');
  app.quit();
});

// 主窗口
let mainWindow;

// 主窗口关闭前的保存操作是否已执行完成
let isBeforeCloseComplete = false;

// 是否正在打包
const isPackaging = process.argv.indexOf('--not-packaged=true') === -1;

/**
 * 快捷键和函数的映射表
 */
let shortcutMap = {
  // 打开文件
  'CmdOrCtrl+O': () => {
    mainWindow.webContents.send('shartcut-pressed', 'open-file');
  },

  // 打开文件夹
  'CmdOrCtrl+F': () => {
    mainWindow.webContents.send('shartcut-pressed', 'open-folder');
  },

  // 切换到下一个标签页
  'CmdOrCtrl+Tab': () => {
    mainWindow.webContents.send('shartcut-pressed', 'next-tab');
  },

  // 切换到上一个标签页
  'CmdOrCtrl+Shift+Tab': () => {
    mainWindow.webContents.send('shartcut-pressed', 'prev-tab');
  },

  // 回到起始页
  'Ctrl+1': () => {
    mainWindow.webContents.send('shartcut-pressed', 'page-start');
  },

  // 切换文件夹侧边栏
  'Ctrl+2': () => {
    mainWindow.webContents.send('shartcut-pressed', 'sidebar-folder');
  },

  // 切换文章目录侧边栏
  'Ctrl+3': () => {
    mainWindow.webContents.send('shartcut-pressed', 'sidebar-directory');
  },

  // 切换历史记录侧边栏
  'Ctrl+4': () => {
    mainWindow.webContents.send('shartcut-pressed', 'sidebar-history');
  },

  // 切换主题
  'Ctrl+5': () => {
    mainWindow.webContents.send('shartcut-pressed', 'toggle-theme');
  },

  // 打开设置页面
  'Ctrl+6': () => {
    mainWindow.webContents.send('shartcut-pressed', 'page-setting');
  },

  // 打开开发者工具
  'Ctrl+Shift+I': () => {
    mainWindow.webContents.toggleDevTools();
  }
};

/**
 * 绑定快捷键
 */
function bindShortcut() {
  for (let shortcut in shortcutMap) {
    if (!globalShortcut.isRegistered(shortcut)) {
      globalShortcut.register(shortcut, shortcutMap[shortcut]);
    }
  }
}

/**
 * 解绑快捷键
 */
function unbindShortcut() {
  for (let shortcut in shortcutMap) {
    if (globalShortcut.isRegistered(shortcut)) {
      globalShortcut.unregister(shortcut);
    }
  }
}

/**
 * 创建窗口
 */
function createWindow() {
  let mainWindowState = windowStateKeeper({
    defaultWidth: 1024,
    defaultHeight: 640
  });

  mainWindow = new BrowserWindow({
    'x': mainWindowState.x,
    'y': mainWindowState.y,
    'width': mainWindowState.width,
    'height': mainWindowState.height,
    autoHideMenuBar: true
  });

  mainWindowState.manage(mainWindow);

  mainWindow.loadURL(url.format({
    pathname: path.join(__dirname, '../index.html'),
    protocol: 'file:',
    slashes: true
  }));

  mainWindow.on('closed', () => {
    mainWindow = null;
  });

  mainWindow.on('blur', () => {
    unbindShortcut();
  });

  mainWindow.on('focus', () => {
    bindShortcut();
  });
}

/**
 * 打开选择文件对话框
 */
function openFileDialog() {
  dialog.showOpenDialog({
    title: '打开 Markdown 文件',
    filters: [{
      name: 'Markdown',
      extensions: ['markdown', 'md']
    }],
    properties: ['openFile']
  }, function(files) {
    if (files) {
      // 向渲染进程发送事件
      mainWindow.webContents.send('selected-file', files);
    }
  });
}

/**
 * 打开选择文件夹对话框
 */
function openFolderDialog() {
  dialog.showOpenDialog({
    title: '打开文件夹',
    properties: ['openDirectory']
  }, function(files) {
    if (files) {
      // 向渲染进程发送事件
      mainWindow.webContents.send('selected-folder', files);
    }
  });
}

/**
 * 应用启动后初始化操作
 */
app.on('ready', () => {
  createWindow();
  bindShortcut();

  // 监听渲染进程的打开文件事件
  ipcMain.on('open-file-dialog', () => {
    openFileDialog();
  });

  // 监听渲染进行的打开文件夹事件
  ipcMain.on('open-folder-dialog', () => {
    openFolderDialog();
  });

  // 关闭窗口前发送事件，在渲染进程中保存操作
  mainWindow.on('close', (e) => {
    if (!isBeforeCloseComplete) {
      e.preventDefault();

      // 发送事件给渲染进程，保存所有状态
      mainWindow.webContents.send('before-close');
    }
  });
});

/**
 * 应用关闭前的操作
 */
app.on('will-quit', () => {
  globalShortcut.unregisterAll();
});

/**
 * 应用关闭前的操作执行完
 */
ipcMain.on('before-close-complete', function() {
  isBeforeCloseComplete = true;
  app.quit();
});

/**
 * 所有窗口关闭后的操作
 */
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit();
  }
});

/**
 * 应用激活后的操作
 */
app.on('activate', () => {
  if (mainWindow === null) {
    createWindow();
  }
});
